iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Software Development

Python 微進階系列 第 19

Python 微進階 Day19 - class(類別) - 3 - @staticmethod、@classmethod

  • 分享至 

  • xImage
  •  

class(類別)

  • 在前面提到 methord 時,有使用 decorator(修飾器)的方法,可以稱為 instance method(實體方法)
  • 因為 self 參數指向物件,因此可以改變物件的狀態,類別的狀態則透過 self.__class__.屬性 的方式來改變
  • 使用 decorator(修飾器) 的方法
    • static method(靜態方法)
    • class method(類別方法)

static method(靜態方法)

  • static method(靜態方法):在方法上方,使用 @staticmethod 修飾器建立
  • 不會有一個 self 參數,因此無法改變類別和物件的狀態
    • 若內部需要使用到類別變數,使用 類別名.變數
  • 通常用在比較單純傳入參數運算的情況
class M:
    time = 2
    def __init__(self):
        self.x = "x"

    @staticmethod
    def print_something(something):
        # 使用 M.time 呼叫
        print(something * M.time)

c = M()
c.print_something("abc")
# abcabc
# 單純執行參數相關
# 使用 M.time 呼叫 time

class method(類別方法)

  • class method(類別方法):在方法上方,使用 @classmethod 修飾器建立
  • 會有一個 cls 參數,指向類別,因此只能改變類別的狀態
    • 若內部需要使用到類別變數,使用 cls.變數
  • 通常應用於產生複雜的物件,透過類別方法將複雜的邏輯封裝,變成可以直接呼叫類別方法來快速建立相關物件
  • 因為透過相對應的類別方法就可以快速的建立對應的物件,而較複雜的的過程都封裝在類別方法內,因此類別方法也被稱為 factory method(工廠方法)
class M:
    time = 2
    def __init__(self, c):
        self.color = c
    
    @classmethod
    def color_black(cls):
        return cls("black")

    @classmethod
    def print_something(cls, something):
        # 使用 cls.time 呼叫
        print(something * cls.time)

c = M.color_black()
# 透過類別方法建立黑色的物件
print(c.color)
# black

c.print_something("abc")
# abcabc
# 使用 cls.time 呼叫 time

參考資料

次回

連續幾天下來,似乎有比較懂類別了,希望不是錯覺


上一篇
Python 微進階 Day18 - class(類別) - 2 - class variables、private variable、private method
下一篇
Python 微進階 Day20 - class(類別) - 4 - @property
系列文
Python 微進階31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言